package wxapp

import (
    "errors"
	"wxsdk/wxpay/core"
	. "wxsdk/wxpay"
	"wxsdk/wxpay/utils/mapstruct"
	//"github.com/astaxie/beego"
)

//1.定义结构体，存储查询订单号使用的参数,注意：out_trade_no和transaction_id必须填一个，2个都存在的情况下，优先以transaction_id为准
type OrderqueryRequest struct {
	Appid          string   `xml:"appid"`                    //微信分配的小程序ID
	MchId          string   `xml:"mch_id"`                   //mch_id
	SubAppid       string   `xml:"sub_appid,omitempty"`      //小程序的APPID,当前调起支付的小程序APPID(服务商特有参数)
	SubMchId       string   `xml:"sub_mch_id,omitempty"`     //微信支付分配的子商户号(服务商特有参数)
	TransactionId  string   `xml:"transaction_id,omitempty"` //微信订单号
	OutTradeNo     string   `xml:"out_trade_no,omitempty"`   //商户订单号
	NonceStr       string   `xml:"nonce_str"`                //随机字符串
	Sign           string   `xml:"sign"`                     //签名
	SignType       string   `xml:"sign_type,omitempty"`      //签名类型
}


// 查询订单
type OrderQueryResponse struct {
	BaseResponse `xml:",innerXml,omitempty"`
	OpenId         string `xml:"openid,omitempty"`           // 用户标识
	IsSubscribe    string `xml:"is_subscribe,omitempty"`     // 是否关注公众账号
	SubOpenid      string `xml:"sub_openid,omitempty"`       // 用户子标识(服务商特有参数)
	SubIsSubscribe string `xml:"sub_is_subscribe,omitempty"` // 是否关注子公众账号(服务商特有参数)
	TradeType      string `xml:"trade_type,omitempty"`       // 交易类型
	TradeState     string `xml:"trade_state,omitempty"`      // 交易状态
	BankType       string `xml:"bank_type,omitempty"`        // 付款银行
	TotalFee       string `xml:"total_fee,omitempty"`        // 总金额
	FeeType        string `xml:"fee_type,omitempty"`         // 货币种类
	CashFee        string `xml:"cash_fee,omitempty"`         // 现金支付金额
	CashFeeType    string `xml:"cash_fee_type,omitempty"`    // 现金支付货币类型
	CouponFee      string `xml:"coupon_fee,omitempty"`       // 代金券或立减优惠金额
	CouponCount    string `xml:"coupon_count,omitempty"`     // 代金券或立减优惠使用数量
	TransactionId  string `xml:"transaction_id,omitempty"`   // 微信支付订单号
	OutTradeNo     string `xml:"out_trade_no,omitempty"`     // 商户订单号
	Attach         string `xml:"attach,omitempty"`           // 附加数据
	TimeEnd        string `xml:"time_end,omitempty"`         // 支付完成时间
	TradeStateDesc string `xml:"trade_state_desc,omitempty"` // 交易状态描述
	SettlementTotalFee string `xml:"settlement_total_fee,omitempty"` // 应结订单金额
	/*
	CouponTypeN        string `xml:"coupon_type_$n,omitempty"`       //代金券类型
	CouponIdN          string `xml:"coupon_id_$n,omitempty"`         //代金券ID
	CouponFeeN         string `xml:"coupon_fee_$n,omitempty"`        //单个代金券支付金额
	*/
}

func  OrderQuery(appId,mchId,subAppid,subMchId,appSecret,transactionId,orderIdStr string) (OrderQueryResponse,error){
	client := core.GetWxPayClient(appId,mchId,appSecret,nil)
	var rsp OrderQueryResponse
	var req = new(OrderqueryRequest)
	if len(subAppid) > 0 {
	   req.SubAppid = subAppid
	}
	if len(subMchId) > 0 {
	   req.SubMchId = subMchId
	}
	if transactionId == "" && orderIdStr == "" {
	   return rsp, errors.New("Refund: at least of transation_id/out_trade_no required")
	}
	//req.TransactionId = transactionId
	req.OutTradeNo =  orderIdStr      //商户订单号
	rspMap, err := client.ExcuteMap(OrderQueryUrl, req)
    if err != nil {
		return rsp, err
	}
	err = mapstruct.Map2Struct(rspMap, rsp, "xml")
	if err != nil {
		return rsp, err
	}
	return rsp, nil
}
